package cn.kent;

import java.util.Arrays;

/**
 * 26. 删除**有序**数组中的重复项
 * 思路：
 * 1. 遍历一遍，每次拿最后一个和前面的一位进行比对，是否是重复的，重复即删除
 * 2. 遍历一遍找到重复的，遍历第二遍，删除重复的。
 * 3. 转成list数组，直接remove，len--
 */
public class RemoveDuplicates {
    public static void main(String[] args) {
        // int[] nums = {0, 0, 1, 1, 1, 2, 2, 3, 3, 4}; // --> {0,1,2,3,4****}
        int[] nums = {1,2};
        System.out.println("# 要处理的数组遍历 #");
        Arrays.stream(nums).forEach(num -> {
            System.out.printf(num + "\t");
        });

        int i = removeDuplicates2(nums);

        System.out.println("\n输出结果："+ i);
        System.out.println("\n# 结果遍历 #");
        Arrays.stream(nums).forEach(num -> {
            System.out.printf(num + "\t");
        });

    }

    /**
     * 1ms
     */
    public static int removeDuplicates(int[] nums) {
        // 判断是否为1或0个数
        if (nums.length < 2) {
            return nums.length;
        }

        // 记录不重复的索引
        int[] indexs = new int[nums.length];
        int index = 1;
        indexs[0] = nums[0];
        for (int i = 1; i < nums.length; i++) {
            // 判断前一个和当前数是否相等
            if (!(nums[i] == nums[i - 1])) {
                indexs[index] = nums[i];
                index++;
            }
        }

        // 将不重复的索引遍历赋值到原数组
        for (int i = 0; i < index; i++) {
            nums[i] = indexs[i];
        }

        return index;

    }

    /**
     * 官方： 双指针
     * 0ms
     */
    public static int removeDuplicates2(int[] nums) {
        int n = nums.length;
        if (n == 0) {
            return 0;
        }
        int fast = 1,slow =1;
        while (fast < n) {
            if (nums[fast] != nums[fast - 1]) {
                nums[slow] = nums[fast];
                ++slow;
            }
            ++fast;
        }
        return slow;
    }
}
